<?php

class Uri{
	private static $urlPage;
	private static $alias = false;
	private static $class;
	private static $method;
	private static $routes;
	private static $POST = null;
	private static $GET = null;
	private static $REST = null;
	private static $SERVER = null;
	private static $security;

	
	public static function setUri($class = 'HomeController', $method = 'index'){
		
		//Recupero os alias existentes
		self::$routes = Route::getRoutes();
		
		//Classe padrão quando não e passado nenhuma classe na URL
		self::$class = $class;
		// Metodo padrão quando não é passado nenhum metodo na URL 
		self::$method = $method;
		//Recupera as informações passadas na URL;
		$urlTokens = explode('?', $_SERVER['REQUEST_URI']);
		$urlTokens = explode('/', $urlTokens[0]);
		$urlTokens = array_slice($urlTokens, 1, count($urlTokens) - 1);
		//Limpa os espaços em branco da URL
		self::clearUrl($urlTokens);
		self::setParams();
		self::setAction();
	}
	
	public static function setAction(){
		switch(self::$urlPage[0]){
			case 'tws':
                TWS::handleWS(self::$urlPage[1]);
                break;
            break;
			case 'rest':
				$r = new Restler();
                $r->addAPIClass('CepController', '');
                $r->setSupportedFormats('JsonFormat', 'XmlFormat', 'yamlformat', 'plistformat', 'amfformat');
                $r->addAuthenticationClass('SimpleAuth');
                $r->handle();
			break;
			case 'service':
				echo 'service';
			break;
			case 'resource':
				echo 'service';
			break;
			default:
				if(self::setClass()){
					Controller::exec();
				}else{
					Redirect::location('erro', 'index');
				}
			break;
		}
	}
	
	private static function setClass(){
		if(!empty(self::$urlPage[0])){
			self::$class = self::$urlPage[0]; 
			if (array_key_exists(self::$class, self::$routes)) {
				self::$alias = true;
				self::$class = self::$routes[self::$urlPage[0]]['controller'];
			} else { // se não existir define o parametro da url como classe
				self::$class = ucfirst(self::$class) . 'Controller';
			}
		}
		// Verifica se a classe existe
		if (self::checkClass()) {
			if(self::setMethod()){
				return true;
			}
		} 
		
		return false;
	}
	
	/**
	 * Define o metodo que sera executado e retorna true ou false;
	 * @return boolean
	 */
	private static function setMethod() {
		// Se a $urlPage possuir mais de 1 parametro
		if (count(self::$urlPage) > 1) {
			self::$method = self::$urlPage[1];
			
			// se methodo não existir
			if (!self::checkMethod()) {
				if (self::$alias) {
					self::$method = self::$routes[self::$urlPage[0]]['method'];
					return (self::checkMethod()) ? true : false;
				}else{
					return false;
				}
			}
			return true;
			
		} else { // se a $urlPage for menor ou igual a 1 e pq nao foi passado o metodo pela url
			
			self::$method = (self::$alias) ? self::$routes[self::$urlPage[0]]['method'] : 'index';
	
			if (!self::checkMethod()) {
				return false;
			}
			return true;
		}
	}
	
	
	/**
	 * Verifica se a classe existe
	 * @return boolean
	 */
	private static function checkClass() {
		return (class_exists(self::$class)) ? true : false;
	}
	
	/**
	 * Verifica se o metodo existe
	 * @return boolean
	 */
	private static function checkMethod() {
		$class = new self::$class;
		if (method_exists($class, self::$method)) {
			$class = null;
			return true;
		} 
		$class = null;
		return false;
	}
	
	/**
	 * Recupera os valores passados via GET, POST, REST, OU VARIAVEIS DE AMBIENTES
	 * @return void
	 */
	private static function setParams(){

		//Se for passado parametros via POST
		if (isset($_POST)) {
			$getObject = array();
			foreach ($_POST as $chave => $valor) {
				if($chave == 'json'){
					$valor = str_replace("\\", "", $valor);
					$valor = json_decode($valor);
					$getObject[$chave] = $valor;
				}else{
					$getObject[$chave] = $valor;
				}
			}
			self::$POST = $getObject;
		}
		//Se for passado parametros via GET
		if (isset($_GET)) {
			$getObject = array();
			foreach ($_GET as $chave => $valor) {
				$getObject[$chave] = $valor;
			}
			self::$GET = $getObject;
		}
		//Se for passado parametros via REST
		parse_str(file_get_contents("php://input"), $post_vars);
		if (isset($post_vars['data'])) {
			$info = $post_vars['data'];
			self::$REST = json_decode(stripslashes($info));
		}
		
		//Variaveis de Ambiente
		if (isset($_SERVER)) {
			$getObject = array();
			foreach ($_SERVER as $chave => $valor) {
				$getObject[$chave] = $valor;
			}
			self::$SERVER = $getObject;
		}
	}
	
	
	/**
	 * Retorna a classe;
	 * @return string classe
	 */
	public static function getClass() {
		return self::$class;
	}
	
	/**
	 * Retorna o Metodo
	 * @return String Metodo
	 */
	public static function getMethod() {
		return self::$method;
	}
	
	/*
     * Retorna os parametros passados via POST
     * @return Array associativo
     */
    public static function getPOST($value = NULL) {
        if (!is_null($value)) {
            return key_exists($value, self::$POST) ? self::$POST[$value] : FALSE;
        }

        return (Object) self::$POST;
    }

    /*
     * Retorna os parametros passados via GET
     * @return Array associativo
     */
    public static function getGET($value = NULL) {
        if (!is_null($value)) {
            return key_exists($value, self::$GET) ? self::$GET[$value] : FALSE;
        }
        return self::$GET;
    }

    /*
     * Retorna os parametros passados via PUT/DELETE
     * @return Array associativo
     */
    public static function getREST() {
        return self::$REST;
    }

    /*
     * Retorna os parametros do servidor - SERVER
     * @return Array associativo
     */
    public static function getSERVER($value = NULL) {
        return self::$SERVER;
    }
	
	/**
	 * Limpa os espaços em branco da URL
	 * @param String $urlTokens
	 * @return void
	 */
	public static function clearUrl($urlTokens){
		$ctrl = true;
		while($ctrl && count($urlTokens) > 1){
			$count = count($urlTokens)-1;
			if(empty($urlTokens[$count])){
				array_pop($urlTokens);
			}else{
				$ctrl = false;
			}
		}
		self::$urlPage = $urlTokens;
	}
	
	/*
	 * Retorna o usuario passado via auth
	* @return Array associativo
	*/
	public static function getAuthUser() {
		return isset(self::$SERVER['PHP_AUTH_USER']) ? self::$SERVER['PHP_AUTH_USER'] : FALSE;
	}
	
	/*
	 * Retorna a senha passado via auth
	* @return Array associativo
	*/
	public static function getAuthPw() {
		return isset(self::$SERVER['PHP_AUTH_PW']) ? self::$SERVER['PHP_AUTH_PW'] : FALSE;
	}
	
	public static function getTypeSecurity() {
		return self::$security;
	}
	
	public static function getUri($key = NULL){
		if(!is_null($key)){
			return self::$urlPage[$key];
		}
		return self::$urlPage;
	}
}

?>